# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Contributor: Milan P. Stanić <mps@arvanta.net>
# Maintainer: Jakub Jirutka <jakub@jirutka.cz>
pkgname=crystal
pkgver=1.12.1
pkgrel=0
_bootver=1.11.2
_llvmver=17
pkgdesc="The Crystal Programming Language"
url="https://crystal-lang.org/"
arch="x86_64 aarch64"
license="Apache-2.0"
depends="
	gc-dev
	gcc
	gmp-dev
	libatomic_ops
	libevent-dev
	libevent-static
	musl-dev
	pcre2-dev
	"
checkdepends="
	openssl-dev
	tzdata
	yaml-dev
	zlib-dev
	"
makedepends="
	libxml2-dev
	llvm$_llvmver-dev
	"
[ "${BUILD_STATIC:-0}" -eq 1 ] && makedepends="$makedepends
	libxml2-static
	llvm$_llvmver-static
	zlib-static
	zstd-static
	"
subpackages="$pkgname-doc
	$pkgname-bash-completion
	$pkgname-zsh-completion
	"
source="$pkgname-$pkgver.tar.gz::https://github.com/crystal-lang/$pkgname/archive/$pkgver.tar.gz
	https://dev.alpinelinux.org/archive/crystal/crystal-$_bootver-x86_64-alpine-linux-musl.tar.gz
	https://dev.alpinelinux.org/archive/crystal/crystal-$_bootver-aarch64-alpine-linux-musl.tar.gz
	"

_coredir="/usr/lib/$pkgname/core"
_shardsdir="/usr/lib/$pkgname/shards"

export CRYSTAL_CONFIG_VERSION="$pkgver"
export CRYSTAL_CACHE_DIR="$srcdir/.cache"
export LLVM_CONFIG="/usr/lib/llvm$_llvmver/bin/llvm-config"

# Build static crystal binary and upload it to dev.a.o, so it can be used
# for building crystal next time (needed for bootstrapping).
# NOTE: After https://github.com/crystal-lang/crystal/issues/5689 is fixed,
# we can also use prebuilt binary from upstream if needed.
snapshot() {
	local binary="$builddir/.build/crystal"
	local tarname="$pkgname-$pkgver-$CTARGET"

	if [ ! -f "$binary" ] || ! file "$binary" | grep -qw 'statically linked'; then
		msg "Building statically linked crystal..."
		BUILD_STATIC=1 \
			abuild deps clean unpack prepare build
	fi

	cd "$srcdir"

	strip "$builddir"/.build/crystal
	install -D -m 755 "$builddir"/.build/crystal "$tarname"/bin/crystal
	tar -czf "$tarname.tar.gz" "$tarname"

	msg "Uploading $tarname.tar.gz to dev.alpinelinux.org"
	scp "$tarname.tar.gz" dev.alpinelinux.org:/archive/$pkgname/

	APKBUILD="../APKBUILD" abuild undeps
}

prepare() {
	default_prepare

	# FIXME: These specs fail with invalid memory access.
	rm spec/compiler/compiler_spec.cr

	cat > Makefile.local <<-EOF
		progress = 1
		threads = ${JOBS:-2}
		verbose = 1
		FLAGS = --verbose --target $CTARGET ${BUILD_STATIC:+"--link-flags=-no-pie"}
		LLVM_CONFIG = $LLVM_CONFIG
	EOF
}

build() {
	make crystal \
		CRYSTAL_CONFIG_BUILD_COMMIT= \
		CRYSTAL_CONFIG_PATH="lib:$_shardsdir:$_coredir" \
		PATH="$srcdir/$pkgname-$_bootver-$CBUILD/bin:$PATH" \
		release=1 \
		static=${BUILD_STATIC:-}
}

check() {
	make std_spec threads=1 SPEC_FLAGS='--no-color --verbose'

	find samples -name '*.cr' -print0 | xargs -0 -tn 1 ./bin/crystal build --no-codegen

	# Takes ~1 hour on x86_64, ~1.5 hour on aarch64.
	#make compiler_spec threads=1 SPEC_FLAGS='--no-color --verbose'
}

package() {
	install -D -m 755 .build/crystal "$pkgdir"/usr/bin/crystal
	install -D -m 644 man/crystal.1 "$pkgdir"/usr/share/man/man1/crystal.1

	mkdir -p "$pkgdir$_coredir" "$pkgdir$_shardsdir"
	cp -r src/* "$pkgdir$_coredir"/

	install -D -m 644 etc/completion.bash \
		"$pkgdir"/usr/share/bash-completion/completions/$pkgname
	install -D -m 644 etc/completion.zsh \
		"$pkgdir"/usr/share/zsh/site-functions/_$pkgname

	rm "$pkgdir$_coredir"/llvm/ext/llvm_ext.o
}

sha512sums="
bd0c085d44a473b86797fa64ce9a5c66c7d3eda44bdba929faee490b635aef45bdf84b45baaa5dfea8e2b6fd218d1ae7fbdf117d3924b04b284075d4a500e55c  crystal-1.12.1.tar.gz
a3269baad1e5417cc22c93daf160794296a5d2a00ef3694c4ebff391d950fd6960b9c52ef34211bb0fcb359a39e396490b0fe1e3f2b4a3e1f46921d5b0da935a  crystal-1.11.2-x86_64-alpine-linux-musl.tar.gz
42757038f284bf02b142510f9eeca96daa4148af33362e84105a74b6943ea1030c4039285995510b0b8014bc3c1d9a6829b0e269af3cdea0af1591a703fa14ac  crystal-1.11.2-aarch64-alpine-linux-musl.tar.gz
"
